package utils;


import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @Description : 生产环境不建议使用。用于统一在Linux和Win10上的获取资源路径的实现方式。
 * Created by TestOpsFeng on 2021-3-30.
 */
public class PathUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(PathUtil.class);
    private static final String SPEA = File.separator;

    /**
     * 调试时输出：D:\workspace\copyfilesfromjar
     * windows jar包输出： D:\workspace\copyfilesfromjar\target
     * linux jar包输出：/home/dongweihang
     *
     * @return 返回jar执行目录
     */
    public static String getApplicationClassPath() {
        return System.getProperty("user.dir");
    }

    /**
     * 生产环境中不推荐，生产环境使用：InputStream来读取
     * @return 返回resources目录（执行过程中会把jar包中的文件解压到系统目录中）
     */
    public static String getResourcePath() {
        File file = new File(getApplicationClassPath());
        if (file.exists() && file.isDirectory() && file.listFiles() != null) {
            String jarFileName = Arrays.stream(file.listFiles()).map(File::getName).filter(s -> s.contains(".jar")).findFirst().orElse(null);
            String resourcePath = null;
            if (jarFileName != null) {
                //如果目录下包含jar ，说明是用jar包运行的，先用jar -xf解压
                try {
                    Process process = Runtime.getRuntime().exec("jar -xf " + jarFileName);
                    process.waitFor();
                } catch (IOException | InterruptedException e) {
                    LOGGER.debug("can not exec jar -xf");
                    e.printStackTrace();
                    return null;
                }
                resourcePath = file.getAbsolutePath().concat(SPEA).concat("BOOT-INF").concat(SPEA).concat("classes").concat(SPEA);
                return resourcePath;
            } else {
                //不包含jar，说明在调试模式中 后接\target\classes
                resourcePath = file.getAbsolutePath().concat(SPEA).concat("target").concat(SPEA).concat("classes").concat(SPEA);
                return resourcePath;
            }
        }
        return null;
    }
}
